package com.chen.manager.service.impl;

import com.alibaba.excel.EasyExcel;
import com.chen.manager.listener.CategoryListener;
import com.chen.manager.listener.ExcelListener;
import com.chen.manager.mapper.CategoryMapper;
import com.chen.manager.service.CategoryService;
import com.chen.model.entity.product.Category;
import com.chen.model.vo.product.CategoryExcelVo;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.CollectionUtils;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * @author cgj
 * @date 3/1/25 3:19 PM
 */
@Service
@Transactional
public class CategoryServiceImpl implements CategoryService {
    @Autowired
    private CategoryMapper categoryMapper;

    /**
     * 根据pid查询 所对应的产品列表
     * @param pid
     * @return
     */
    @Override
    public List<Category> getCategoryListByParentId(Long pid) {
        List<Category> categoryList=categoryMapper.selectCategoryListByParentId(pid);
        //前端要的数据有,hasChildren是否有子节点,但是数据库,并没有封装,这里我们需要自己处理
        if(CollectionUtils.isEmpty(categoryList)) return  null;
        for (Category category : categoryList) {
            //统计孩子数量,方便对hasChildren进行填值
            Long count=categoryMapper.selectSubCount(category.getId());
            if(count.intValue()>0){
                //说明是父级分类
                category.setHasChildren(true);
            }else {
                //说明有子级分类
                category.setHasChildren(false);
            }

        }
        return categoryList;
    }

    /**
     *  导出 excel文件,写操作
     * @param response
     */
    @Override
    public void excelExport(HttpServletResponse response) {
        try {
            // 设置mime类型
            response.setContentType("application/vnd.ms-excel");
            //设置浏览器编码方法
            response.setCharacterEncoding("utf-8");
            //对路径进行编码
            String fileName = URLEncoder.encode("分类数据", "UTF-8");

            //设置 HTTP 响应头，告诉浏览器该请求是一个文件下载（attachment），并指定下载的文件名为 fileName.xlsx。
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");

            //准备数据
            //查询全部分类,不需要带树形结构
            List<Category>  categoryList=categoryMapper.selectAllCategory();
             //查出来的数据比实际用到的数据多
            //   查询出来的类和对应的vo类不匹配, 但是有部分属性相同,这时候可以用map()函数
            List<CategoryExcelVo> categoryExcelVoList = categoryList.stream().map(category -> {
                CategoryExcelVo categoryExcelVo = new CategoryExcelVo();
                //   BeanUtils.copyProperties();   可以把参数一的属性的值,拷贝到参数2中,    要求两个属性必须一致
                BeanUtils.copyProperties(category, categoryExcelVo);
                return categoryExcelVo;
            }).collect(Collectors.toList());
            //写出数据
            EasyExcel.write(response.getOutputStream(), CategoryExcelVo.class).sheet("category").doWrite(categoryExcelVoList);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


    /**
     * 用户上传excel
     *  1 定义对应的实体类
     *  2 定义监听器
     *  3  读取数据
     *  4  上传到数据库
     * @param file
     */
    @Override
    public void uploadExcel(MultipartFile file) {
        try {
            //创建监听器
            CategoryListener<CategoryExcelVo> CategoryListener = new CategoryListener<CategoryExcelVo>(categoryMapper);
            EasyExcel.read(file.getInputStream(), CategoryExcelVo.class,CategoryListener).sheet().doRead();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
